/*
 * @lc app=leetcode.cn id=24 lang=java
 *
 * [24] 两两交换链表中的节点
 */

// @lc code=start
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        // ListNode dummy=new ListNode(0,head);//设置虚节点
        // ListNode temp=dummy;//代表每次迭代的链表临时虚节点
        // while(temp.next!=null&&temp.next.next!=null){//至少还存在两个节点才继续迭代
        //     ListNode node1=temp.next;//代表需要交换的两个节点的第一个
        //     ListNode node2=temp.next.next;//代表需要交换的两个节点的第二个
        //     //交换
        //     temp.next=node2;
        //     node1.next=node2.next;
        //     node2.next=node1;
        //     //temp更新
        //     temp=node1;

        // }
        // return dummy.next;
        
        //递归法
        if(head==null||head.next==null){
            return head;
        }
        ListNode newHead=head.next;
        //实际上就是传入去除前两个节点后的节点作为后面链表的头节点
        head.next=swapPairs(newHead.next);
        newHead.next=head;//正常翻转前两个节点
        return newHead;
    }
}
// @lc code=end

